home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / AOCE / Development Tools / Sample Code / Standard Catalog Package / DTS AddressOMatic / Src / DisplayDSSpec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-18  |  6.4 KB  |  272 lines  |  [TEXT/KAHL]

  1. /*                                    DisplayDSSpec.c                                */
  2. /*
  3.  * AddressOMatic Sample
  4.  * DisplayDSSpec.c
  5.  * Copyright © 1993 Apple Computer Inc. All rights reserved.
  6.  *
  7.  * These functions unpack and display a packed DSSpec structure.
  8.  */
  9. #include "AddressOMaticTest.h"
  10. #define SPEC    (*theDSSpecDumpPtr)
  11.  
  12.  
  13. void
  14. DisplayDSSpecType(
  15.         register BrowserPtr                browserPtr,
  16.         OSType                            specType
  17.     );
  18. void
  19. DisplayRecordID(
  20.         register BrowserPtr                browserPtr,
  21.         RecordIDPtr                        recordIDPtr
  22.     );
  23. void
  24. DisplayExtensionType(
  25.         register BrowserPtr                browserPtr,
  26.         OSType                            extensionType
  27.     );
  28. void
  29. DisplayExtensionSize(
  30.         register BrowserPtr                browserPtr,
  31.         unsigned short                    extensionSize
  32.     );
  33. void
  34. DisplayDNodeNumber(
  35.         register BrowserPtr                browserPtr,
  36.         unsigned short                    dsRefNum
  37.     );
  38. void
  39. DisplayCatalogName(
  40.         register BrowserPtr                browserPtr,
  41.         const RStringPtr                catalogNamePtr
  42.     );
  43. void
  44. DisplayPathNames(
  45.         register BrowserPtr                browserPtr,
  46.         unsigned short                    pathNameCount,
  47.         RStringPtr                        *pathNameVector
  48.     );
  49.  
  50. /*
  51.  * UnpackPackedDSSpec unpacks a DSSpec into its constituent parts.
  52.  */
  53. void
  54. UnpackPackedDSSpec(
  55.         register BrowserPtr                browserPtr,
  56.         PackedDSSpecPtr                    packedDSSpecPtr,
  57.         register DSSpecDumpPtr            theDSSpecDumpPtr
  58.     )
  59. {
  60.         CLEAR(SPEC);
  61.         SPEC.isValidDSSpec = OCEValidPackedDSSpec(packedDSSpecPtr);
  62.         if (SPEC.isValidDSSpec) {
  63.             OCEUnpackDSSpec(packedDSSpecPtr, &SPEC.theDSSpec, &SPEC.recordID);
  64.             SPEC.specType = OCEGetDSSpecInfo(&SPEC.theDSSpec);
  65.             SPEC.isNonNullRLI = (SPEC.recordID.rli != NULL);
  66.             if (SPEC.isNonNullRLI) {
  67.                 SPEC.isValidPackedRLI = OCEValidPackedRLI(SPEC.recordID.rli);
  68.                 if (SPEC.isValidPackedRLI) {
  69.                     OCEUnpackRLI(SPEC.recordID.rli, &SPEC.theDSSpecRLI);
  70.                     SPEC.isValidPackedPathName =
  71.                         OCEValidPackedPathName(SPEC.theDSSpecRLI.path);
  72.                     /*
  73.                      * SPEC.isValidPackedPathName is FALSE if we are passed a
  74.                      * reference to a printer or CPU in the AppleTalk catalog.
  75.                      */
  76.                     if (SPEC.isValidPackedPathName) {
  77.                         SPEC.nodeNameCount =
  78.                             OCEDNodeNameCount(SPEC.theDSSpecRLI.path);
  79.                         /*
  80.                          * Allocate a vector that is large enough to hold the
  81.                          * RStrings that make up the path list, then unpack it.
  82.                          */
  83.                         SPEC.partsVector = (RStringPtr *) NewPtrClear(
  84.                                     sizeof (RStringPtr) * SPEC.nodeNameCount
  85.                                 );
  86.                         if (SPEC.partsVector != NULL && MemError() == noErr) {
  87.                             SPEC.isValidPartsVector = TRUE;
  88.                             SPEC.unpackedNodeNameCount = OCEUnpackPathName(
  89.                                         SPEC.theDSSpecRLI.path,
  90.                                         SPEC.partsVector,
  91.                                         SPEC.nodeNameCount
  92.                                     );
  93.                             
  94.                             if (SPEC.unpackedNodeNameCount == SPEC.nodeNameCount)
  95.                                 SPEC.isValidUnpackedNodeNameCount =    TRUE;
  96.                             else {
  97.                                 NOTE("\pInvalid unpackedNodeNameCount");
  98.                             }
  99.                         }
  100.                         else {
  101.                             LOG_Value("\pCan't make parts vector, status", MemError());
  102.                         }
  103.                     }
  104.                     else {
  105.                         NOTE("\pWarning: Invalid packed path name");
  106.                     }
  107.                 }
  108.                 else {
  109.                     NOTE("\pInvalid packed RLI");
  110.                 }
  111.             }
  112.             else {
  113.                 NOTE("\pValid DSSpec, but NULL RLI: not an error");
  114.             }
  115.         }
  116.         else {
  117.                 NOTE("\pInvalid DSSpec");
  118.         }
  119. }
  120.  
  121.  
  122. /*
  123.  * Display the contents of an unpacked DSSpec.
  124.  */
  125. void
  126. DisplayUnpackedDSSpec(
  127.         register BrowserPtr                browserPtr,
  128.         register DSSpecDumpPtr            theDSSpecDumpPtr
  129.     )
  130. {
  131.         DisplayDSSpecType(browserPtr, SPEC.specType);
  132.         DisplayRecordID(browserPtr, &SPEC.recordID);
  133.         DisplayExtensionType(browserPtr, SPEC.theDSSpec.extensionType);
  134.         DisplayExtensionSize(browserPtr, SPEC.theDSSpec.extensionSize);
  135.         if (SPEC.isValidPackedRLI == FALSE)
  136.             NOTE("\pCan't display packed RLI");
  137.         else {
  138.             DisplayDNodeNumber(browserPtr, SPEC.theDSSpecRLI.dNodeNumber);
  139.             DisplayCatalogName(
  140.                 browserPtr,
  141.                 (RStringPtr) SPEC.theDSSpecRLI.directoryName
  142.             );
  143.         }
  144.         DisplayPathNames(browserPtr, SPEC.unpackedNodeNameCount, SPEC.partsVector);
  145. }
  146.  
  147. void
  148. DisposeDSSpecDumpRecord(
  149.         register BrowserPtr                browserPtr,
  150.         register DSSpecDumpPtr            theDSSpecDumpPtr
  151.     )
  152. {
  153. #pragma unused (browserPtr)
  154.         if (SPEC.partsVector != NULL) {
  155.             DisposePtr((Ptr) SPEC.partsVector);
  156.             SPEC.partsVector = NULL;
  157.         }
  158. }
  159.  
  160. /*
  161.  * These functions do the actual formatting and display.
  162.  */
  163. void
  164. DisplayDSSpecType(
  165.         register BrowserPtr                browserPtr,
  166.         OSType                            specType
  167.     )
  168. {
  169.         Str255                            work;
  170.         short                            i;
  171.         
  172.         work[0] = sizeof specType + 2;
  173.         work[1] = '\'';
  174.         BlockMove(&specType, &work[2], sizeof specType);
  175.         for (i = 0; i < sizeof specType; i++) {
  176.             if (work[2 + i] < ' ')
  177.                 work[2 + i] = 0xB0;            /* Substitute "infinity sign"        */
  178.         }
  179.         work[2 + sizeof specType] = '\'';
  180.         switch (specType) {
  181.         case kOCEInvalidDSSpec:
  182.             pstrcat(work, "\p: Invalid DSSpec type");            break;
  183.         case kOCEDirsRootDSSpec:
  184.             pstrcat(work, "\p: Root of all catalogs");            break;
  185.         case kOCEDirectoryDSSpec:
  186.             pstrcat(work, "\p: Catalog");                        break;
  187.         case kOCEDNodeDSSpec:
  188.             pstrcat(work, "\p: Catalog node");                    break;
  189.         case kOCERecordDSSpec:
  190.             pstrcat(work, "\p: Record");                        break;
  191.         case kOCEentnDSSpec:
  192.             pstrcat(work, "\p: Extension type is 'entn'");        break;
  193.         case kOCENOTentnDSSpec:
  194.             pstrcat(work, "\p: Extension type is not 'entn'");    break;
  195.         default:
  196.             pstrcat(work, "\p: Unknown catalog spec. type");    break;
  197.         }
  198.         NOTE(work);
  199. }
  200.  
  201. void
  202. DisplayRecordID(
  203.         register BrowserPtr                browserPtr,
  204.         RecordIDPtr                        recordIDPtr
  205.     )
  206. {
  207.         LOG_RString("\pLocal Record ID Name", recordIDPtr->local.recordName);
  208.         LOG_RString("\pLocal Record ID Type", recordIDPtr->local.recordType);
  209. }
  210.  
  211. void
  212. DisplayExtensionType(
  213.         register BrowserPtr                browserPtr,
  214.         OSType                            extensionType
  215.     )
  216. {
  217.         LOG_OSType("\pExtension type", extensionType);
  218. }
  219.  
  220. void
  221. DisplayExtensionSize(
  222.         register BrowserPtr                browserPtr,
  223.         unsigned short                    extensionSize
  224.     )
  225. {
  226.         LOG_Value("\pExtension size", extensionSize);
  227. }
  228.  
  229. void
  230. DisplayDNodeNumber(
  231.         register BrowserPtr                browserPtr,
  232.         unsigned short                    dsRefNum
  233.     )
  234. {
  235.         LOG_Value("\pDNode RefNum", dsRefNum);
  236. }
  237.  
  238. void
  239. DisplayCatalogName(
  240.         register BrowserPtr                browserPtr,
  241.         const RStringPtr                catalogNamePtr
  242.     )
  243. {
  244.         LOG_RString("\pCatalog Name", catalogNamePtr);
  245. }
  246.  
  247. void
  248. DisplayPathNames(
  249.         register BrowserPtr                browserPtr,
  250.         unsigned short                    pathNameCount,
  251.         RStringPtr                        *pathNameVector
  252.     )
  253. {
  254.         short                            i;
  255.         Str255                            work;
  256.         Str15                            value;
  257.         
  258.         LOG_Value("\pPath Name count", pathNameCount);
  259.         if (pathNameVector == NULL)
  260.             NOTE("\pNULL path name vector");
  261.         else {
  262.             for (i = 0; i < pathNameCount; i++) {
  263.                 NumToString(i, value);
  264.                 pstrcpy(work, "\p[");
  265.                 pstrcat(work, value);
  266.                 pstrcat(work, "\p]");
  267.                 LOG_RString(work, pathNameVector[i]);
  268.             }
  269.         }
  270. }
  271.  
  272.